
import openpyxl
from Common import Config


class CaseData():
    pass


class Read_Excel:
    """
    excel操作
    openpyxl模块操作指南
    https://blog.csdn.net/weixin_43094965/article/details/82226263
    """
    def __init__(self, file_name, sheet_name: int or str = 1):
        """
        操作excle文件方法
        :param file_name:   文件名称/名称路径
        :param sheet_name:  表单名称
        """
        self.file_name = file_name
        self.sheet_name = sheet_name

    def open(self):
        """
        打开文件
        :return:
        """

        self.wb = openpyxl.load_workbook(self.file_name)

        if isinstance(self.sheet_name, str):
            ws = self.wb[self.sheet_name]
            self.ws = ws

        elif isinstance(self.sheet_name, int):
            ws = self.wb[self.wb.sheetnames[self.sheet_name - 1]]
            self.ws = ws

    def get_cell(self, row, cell):
        """获取单元格内容"""
        self.open()
        data = self.ws.cell(row, cell).value
        return data

    def read_data(self):
        """
        读取excel, 返回列表嵌套字典的格式
        :return:[{字段名1:值1,字段名2:值1}, {字段名1:值2,字段名2:值2}]
        """
        self.open()
        row = list(self.ws.rows)
        title = []

        for i in row[0]:
            title.append(i.value)

        cases = []
        for data in row[1:]:
            list_data = []
            for j in data:
                list_data.append(j.value)
            case = dict(zip(title, list_data))
            cases.append(case)
        return cases
        # 读取文件方法

    def read_data_obj(self):
        # 打开文件
        self.open()
        # 获取最大行数，并返回一个列表
        rows = list(self.ws.rows)

        # 获取第一行，用作标题
        title = []  # 创建一个列表，用于存放数据
        for i in rows[0]:  # 遍历取出第一行数据
            title.append(i.value)  # 将获取的value存放在title中

        cases = []
        # 遍历剩余的行
        for row in rows[1:]:  # 遍历除了第一行的剩余数据
            data = []
            for j in row:  # 遍历格子中的值
                data.append(j.value)  # 将遍历的值，放在data列表中

            # 将title和data组成一个列表包含字典的数据格式
            case = list(zip(title, data))

            # 创建一个对象，存放数据
            case_obj = CaseData()

            # 遍历用例的数据，存放的对象中
            for k, v in case:
                setattr(case_obj, k, v)
                print(k, v)
            # 将遍历的数据对象，存放在列表中，方便存取
            cases.append(case_obj)

        return cases

    def read_data_step_lists(self):
        """
        读取excel数据，并处理为操作步骤列表
        :return: list
        """
        self.open()
        # 读取最大行数
        case_lines = self.ws.max_row
        # 读取列数
        case_column = self.ws.max_column
        case_list = []

        # 遍历每行（从第二行开始）
        for line in range(2, case_lines+1):
            temp_list = []
            temp_list01 = []
            for column in range(1, case_column + 1):
                step = self.ws.cell(line, column)
                if column in [3,4]:
                    temp_list01.append(step)
                    if len(temp_list01) == 2:
                        temp_list.append(temp_list01)
                else:
                    temp_list.append(step)

            case_list.append(temp_list)

        return case_list


if __name__ == '__main__':
    opera = Read_Excel(Config.BASE_DIR + "/project/demo01/data/login.xlsx")
    print(opera.read_data_obj())